1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 import javax.swing.*;
31 import java.beans.*;
32 import java.util.concurrent.atomic.*;
33 import java.util.concurrent.*;
34
35
36 public class bug6493680 {
37
38
39
40
41
42 private final static int NUMBER_OF_TRIES = 50;
43
44 public static void main(String[] args) throws Exception {
45 for (int i = 0; i < NUMBER_OF_TRIES; i++) {
46 if (! (new Test()).test()) {
47 throw new RuntimeException("failed");
48 }
49 }
50 }
51
52 private static class Test {
53 private final AtomicInteger lastProgressValue = new AtomicInteger(-1);
54 private final Exchanger<Boolean> exchanger = new Exchanger<Boolean>();
55
56 boolean test() throws Exception {
57 TestSwingWorker swingWorker = new TestSwingWorker();
58 swingWorker.addPropertyChangeListener(
59 new PropertyChangeListener() {
60 public void propertyChange(PropertyChangeEvent evt) {
61 if ("progress" == evt.getPropertyName()) {
62 lastProgressValue.set((Integer) evt.getNewValue());
63 }
64 }
65 });
66
67 swingWorker.execute();
68 return exchanger.exchange(true);
69 }
70
71 private class TestSwingWorker extends SwingWorker<Void, Void> {
72 @Override
73 protected Void doInBackground() throws Exception {
74 for (int i = 0; i <= 100; i++) {
75 Thread.sleep(1);
76 setProgress(i);
77 }
78 return null;
79 }
80 @Override
81 protected void done() {
82 boolean isPassed = (lastProgressValue.get() == 100);
83 try {
84 exchanger.exchange(isPassed);
85 } catch (Exception ingore) {
86 }
87 }
88 }
89 }
90
91 }